#ifndef __SERVO_H
#define __SERVO_H

#include "main.h" // HAL库头文件（放到最前面）
#include "tim.h"  // 定时器头文件

// ==================== 配置宏 ====================

// 单片机定时器时钟频率 (单位: Hz)，根据你的芯片配置
// #define TIMER_CLK_FREQ    72000000UL  // 72MHz，例如STM32F103
// #define TIMER_CLK_FREQ  168000000UL  // 168MHz，例如STM32F4
#define TIMER_CLK_FREQ 120000000UL // 120MHz，H7降频
#define DUTY_MAX 1000 // 最大占空比
#define PWM_DEFAULT_FREQ 50 // 默认PWM频率 50Hz控制舵机

// 舵机默认脉宽设置（这些参数可能需要根据舵机型号调整）
#define SERVO_MIN_PULSE_WIDTH 500     // 舵机最小脉宽（对应0度，单位us）
#define SERVO_MAX_PULSE_WIDTH 2500    // 舵机最大脉宽（对应180度，单位us）
#define SERVO_CENTER_PULSE_WIDTH 1500 // 舵机中间位置脉宽（对应90度，单位us）

// ==================== 舵机结构体定义 ====================
typedef struct
{
    TIM_HandleTypeDef *htim; // 舵机使用的定时器
    uint32_t channel;        // 舵机使用的通道
    uint16_t min_angle;      // 舵机最小角度（通常为0）
    uint16_t max_angle;      // 舵机最大角度（通常为180）
    uint16_t min_pulse;      // 舵机最小脉宽（对应min_angle，单位us）
    uint16_t max_pulse;      // 舵机最大脉宽（对应max_angle，单位us）
    uint16_t current_angle;  // 当前舵机角度
    uint16_t speed;          // 舵机移动速度（每次更新的角度增量）
    uint8_t initialized;     // 初始化标志
} Servo_TypeDef;

// ==================== 函数声明 ====================
// 设置PWM函数
void Servo_PWM_Setup(TIM_HandleTypeDef htim, uint32_t Channel, uint32_t freq, uint16_t duty);
void Servo_Duty_Setup(TIM_HandleTypeDef htim, uint32_t Channel, uint16_t duty);

// 舵机初始化
void Servo_Init(Servo_TypeDef *servo, TIM_HandleTypeDef *htim, uint32_t channel);

// 舵机角度控制
void Servo_SetAngle(Servo_TypeDef *servo, uint16_t angle);

// 舵机脉宽设置（直接设置脉宽，单位us）
void Servo_SetPulseWidth(Servo_TypeDef *servo, uint16_t pulse_width_us);

// 舵机移动速度设置
void Servo_SetSpeed(Servo_TypeDef *servo, uint16_t speed);

// 舵机平滑移动到目标角度
void Servo_MoveToAngle(Servo_TypeDef *servo, uint16_t target_angle);

// 舵机限位设置
void Servo_SetLimits(Servo_TypeDef *servo, uint16_t min_angle, uint16_t max_angle,
                     uint16_t min_pulse, uint16_t max_pulse);

// 舵机启动/停止
void Servo_Start(Servo_TypeDef *servo);
void Servo_Stop(Servo_TypeDef *servo);

void GimbalInit(TIM_HandleTypeDef *htim);// 初始化云台舵机
void GimbalSweep(uint32_t duration_ms);// 控制云台摆动指定时间


#endif /* __SERVO_H */

/*使用说明：
// 定义舵机对象
Servo_TypeDef servo1;
// 初始化舵机
Servo_Init(&servo1, &htim1, TIM_CHANNEL_1);

// 设置舵机的限位参数（如果默认值不适合你的舵机）
// 例如：设置舵机角度范围为0-180度，脉宽范围为500-2500us
Servo_SetLimits(&servo1, 0, 180, 500, 2500);

// 设置舵机移动速度（每次更新移动的角度，较小的值移动更平滑但更慢）
Servo_SetSpeed(&servo1, 5);

// 将舵机移动到指定角度
Servo_SetAngle(&servo1, 0);     // 移动到0度

// 使用平滑移动函数（会根据设置的速度逐渐移动到目标位置）
Servo_MoveToAngle(&servo1, 0);  // 平滑移动到0度
HAL_Delay(1000);                // 等待1秒

// 直接设置脉宽（如果需要更精确的控制）
Servo_SetPulseWidth(&servo1, 1500); // 设置为1500us脉宽（通常对应90度）
*/